package com.dc.project.gen.utils;

import com.dc.common.utils.DateUtil;
import com.dc.common.utils.SpringUtil;
import com.dc.project.gen.service.GenCodeService;

/**
 * @author zhuangcy
 * @date 2021/6/19
 * @description 编码生成工具类
 */
public class GenerateCodeUtil {

    private static final int DEFAULT_LENGTH = 4;
    private static final GenCodeService genCodeService;

    static {
        genCodeService = SpringUtil.getBean(GenCodeService.class);
    }

    /**
     * 根据表名获取编码
     *
     * @param tableName 表名
     * @return
     */
    public static Integer getCode(String tableName) {
        return genCodeService.getOneCode(tableName);
    }

    /**
     * 根据表名获取编码
     *
     * @param prefix    前缀
     * @param tableName 表名
     * @return
     */
    public static String getCode(String prefix, String tableName) {
        Integer code = genCodeService.getOneCode(tableName);
        return prefix + code;
    }

    /**
     * 根据表名获取编码
     *
     * @param prefix    前缀
     * @param mantissa  尾数，不足往前补0
     * @param tableName 表名
     * @return
     */
    public static String getCode(String prefix, int mantissa, String tableName) {
        String code = getPrefixCode(mantissa, tableName);
        return prefix + code;
    }

    /**
     * 根据表名获取编码
     *
     * @param prefix    前缀
     * @param tableName 表名
     * @return N0001
     */
    public static String getDefaultCode(String prefix, String tableName) {
        return getCode(prefix, DEFAULT_LENGTH, tableName);
    }

    /**
     * 根据表名获取编码
     *
     * @param prefix    前缀
     * @param mantissa  尾数，不足往前补0
     * @param tableName 表名
     * @return
     */
    public static String getDateCode(String prefix, int mantissa, String tableName) {
        String code = getPrefixDateCode(mantissa, tableName);
        String now = DateUtil.dateTimeNow(DateUtil.YYYYMMDD);
        return prefix + now + code;
    }

    /**
     * 根据表名获取编码
     *
     * @param prefix    前缀
     * @param tableName 表名
     * @return 202106190001
     */
    public static String getDefaultDateCode(String prefix, String tableName) {
        return getDateCode(prefix, DEFAULT_LENGTH, tableName);
    }

    /**
     * 根据表名获取编码
     *
     * @param mantissa  尾数，不足往前补0
     * @param tableName 表名
     * @return
     */
    public static String getDateCode(int mantissa, String tableName) {
        String code = getPrefixDateCode(mantissa, tableName);
        String now = DateUtil.dateTimeNow(DateUtil.YYYYMMDD);
        return now + code;
    }

    private static String getPrefixDateCode(int mantissa, String tableName) {
        String code = genCodeService.getOneDateCode(tableName).toString();
        code = createCode(mantissa, code);
        return code;
    }

    private static String getPrefixCode(int mantissa, String tableName) {
        String code = genCodeService.getOneCode(tableName).toString();
        code = createCode(mantissa, code);
        return code;
    }

    private static String createCode(int mantissa, String code) {
        int length = code.length();
        if (length < mantissa) {
            int len = mantissa - length;
            String pre = "";
            for (int j = 0; j < len; j++) {
                pre += "0";
            }
            code = pre + code;
        }
        return code;
    }

}
